/*************************************************************************
    > File Name    : WebPage.h
    > Author       : LiuLei
    > Mail         : 2261459486@qq.com 
    > Created Time : 2022年11月29日 星期二 16时42分42秒
 ************************************************************************/

#ifndef __LL_WEBPAGE_H__
#define __LL_WEBPAGE_H__

#include "Configuration.h"
#include "WordSegmentation.h"
#include "Simhash.h"
#include <map>
#include <vector>
#include <string>
using std::map;
using std::vector;
using std::string;

class WebPage
{
    friend bool operator==(const WebPage &lhs, const WebPage &rhs);
public:
    WebPage(const string &doc, Configuration *config, WordSegmentation &jieba);
    ~WebPage();

    int getDocId();                                 // 获取文档docid
    string getDoc();                                // 获取文档
    map<string, int> &getWordsMap();                // 获取文档的词频统计

    uint64_t getSimhashValue();
    vector<string> getTopWords();
    
private:
    void processDoc();                              // 处理格式化文档
    void calcTopK();                                // 计算词频最高的20词
    void storeWordsMap(const string &s);            // 统计词频
    void makeSimValue();                            // 计算文档simhash值

    size_t getUtf8ByteNum(const char byte);         // 获取utf-8编码下字符占据的字节数
    int getSummarySize(const string &content);      // 获取摘要大小

public:
    struct                          comp;           // 用于比较大小

private:
    Configuration                   *_config;
    WordSegmentation                &_jieba;         // jieba中文分词库

    string                          _doc;           // 整篇<doc>文档
    int                             _docId;         // 文档id docid
    string                          _docTitle;      // 文档标题
    string                          _docLink;       // 文档链接
    string                          _docSummary;    // 文档摘要
    string                          _docContent;    // 文档内容

    static Simhash                  _sim; 
    uint64_t                        _simValue;

    map<string, int>                _wordsMap;      // 该文档 <单词，词频>
    vector<string>                  _topWords;      // 词频最高的20词
};

#endif
